package monitormercado.apresentacao.tela.simulacao;

import java.util.Date;

import monitormercado.framework.Agendador;
import monitormercado.framework.Analise;
import monitormercado.framework.Controlador;
import monitormercado.framework.Estrategia;
import monitormercado.framework.PeriodoAgendamento;
import monitormercado.framework.Sinal;
import monitormercado.negocio.analise.estrategia.EstrategiaAlugueis;
import monitormercado.negocio.analise.estrategia.EstrategiaBuyHold;
import monitormercado.negocio.analise.estrategia.EstrategiaCandles;
import monitormercado.negocio.analise.estrategia.EstrategiaEstocastico;
import monitormercado.negocio.analise.estrategia.EstrategiaMediasMoveis;
import monitormercado.negocio.analise.estrategia.EstrategiaTripleScreen;
import monitormercado.negocio.analise.estrategia.EstrategiaVolumesAtipicos;
import monitormercado.negocio.analise.estrategia.agendamento.AgendamentoEstrategiaAtual;
import monitormercado.negocio.analise.estrategia.agendamento.IListenerAgendamentoSimulacao;
import monitormercado.negocio.analise.indicador.stochastic.GeradorEstocastico;
import monitormercado.util.Util;

public class ControladorAgendamento extends Controlador implements IListenerAgendamentoSimulacao {
	
	public void agendar(Estrategia estrategia, PeriodoAgendamento periodoAgendamento,  int numeroPeriodos,IListenerAgendamentoSimulacao listener) {
		Date dataAtual = Util.getDataAtual();
		AgendamentoEstrategiaAtual agendamento = new AgendamentoEstrategiaAtual(dataAtual, periodoAgendamento,
			numeroPeriodos,estrategia);
		agendamento.incluirListener(listener);
		Agendador.getInstancia().agendar(agendamento);
	}
	
	public void agendarEstocastico(Double limiteInferior, Double limiteSuperior, PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaEstocastico estrategiaEstocastico =  new EstrategiaEstocastico(new GeradorEstocastico(), 14, 3, limiteInferior, limiteSuperior);
		agendar(estrategiaEstocastico, periodoAgendamento, numeroPeriodos, listener);
	}

	public void agendarBuyAndHold(PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaBuyHold estrategiaBuyHold = new EstrategiaBuyHold();
		agendar(estrategiaBuyHold, periodoAgendamento, numeroPeriodos, listener);
	}

	public void agendarMediasMoveis(Integer emaCurta, Integer emaLonga, Integer periodicidade, PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaMediasMoveis estrategiaMediasMoveis = new EstrategiaMediasMoveis();
		estrategiaMediasMoveis.setNumeroAmostrasEMACurta(emaCurta);
		estrategiaMediasMoveis.setNumeroAmostrasEMALonga(emaLonga);
		estrategiaMediasMoveis.setPeriodicidade(periodicidade);
		agendar(estrategiaMediasMoveis, periodoAgendamento, numeroPeriodos, listener);
	}

	public void agendarTripleScreen(PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaTripleScreen estrategiaTripleScreen = new EstrategiaTripleScreen();
		agendar(estrategiaTripleScreen, periodoAgendamento, numeroPeriodos, listener);
	}
	
	public void agendarAlugueis(PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaAlugueis estrategiaAlugueis = new EstrategiaAlugueis();
		agendar(estrategiaAlugueis, periodoAgendamento, numeroPeriodos, listener);
	}
	
	public void agendarCandles(PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaCandles estrategiaCandles = new EstrategiaCandles();
		agendar(estrategiaCandles, periodoAgendamento, numeroPeriodos, listener);
	}

	public void agendarVolumesAtipicos(Integer ema, Integer periodicidade, Double fator, PeriodoAgendamento periodoAgendamento, int numeroPeriodos, IListenerAgendamentoSimulacao listener) {
		EstrategiaVolumesAtipicos estrategiaVolumesAtipicos = new EstrategiaVolumesAtipicos();
		estrategiaVolumesAtipicos.setNumeroAmostrasEMA(ema);
		estrategiaVolumesAtipicos.setPeriodicidade(periodicidade);
		estrategiaVolumesAtipicos.setFator(fator);
		agendar(estrategiaVolumesAtipicos, periodoAgendamento, numeroPeriodos, listener);
	}
	
	public void tratarAnalise(Analise analise) {
		Sinal ultimoSinal = analise.getUltimoSinal();
		Date ultimaData = Util.getDataNaHoraZero(ultimoSinal.getData());
//		Date dataAtual = Util.diminuiDiasUteis(Util.getDataAtualNaHoraZero(), 1);
		Date dataAtual = Util.getDataAtualNaHoraZero();
		if (ultimaData.equals(dataAtual)) {
			System.out.println(ultimoSinal.getTick().getSigla() + " " + ultimoSinal);
			// System.out.println(ultimoSinal.getIndicador());

		}
	}
}
